package com.yangrong.thread.chapter1;

/**
 * 单例模式的懒加载
 * 
 * @author YangRong
 * @date 2020年6月3日
 */
public class SingletonObject4 {

	private static SingletonObject4 instance;

//	private Object obj1;
//	private Object obj2;
	
	private SingletonObject4() {
//		obj1 = new Object();
//		obj2 = new Object();
	}

	// 加入synchronized关键字解决多线程情况下可能产生1个以上实例的问题
	// 用double check的方式解决synchronized带来的性能损失
	public static SingletonObject4 getInstance() {
		if (null == instance) {
			synchronized (SingletonObject4.class) {
				if (null == instance)
					instance = new SingletonObject4();
				/*
				 * instance		0x0000001
				 * 
				 * obj1			0x0000002
				 * obj2			0x0000003
				 * 
				 * 这三个对象的开辟是允许重排序的，因此当返回instance时可能obj1\obj2还没有初始化完成，其他线程访问时就会返回空指针异常
				 * instance定义为volatile，则可以保证instance在obj1\obj2之后进行初始化
				 */
			}
		}

		// 多线程下可能返回不完整的实例，虽然已经new了实例，但实例中的属性或外部调用还未完成
		return SingletonObject4.instance;
	}

}
